/*
 * Copyright (C) 2016-2017 AnStudio
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package com.astudio.lhasa.workers.translators;

import com.astudio.lhasa.database.beans.OfflineDictWord;
import com.astudio.lhasa.database.helpers.OfflineDictManager;
import com.astudio.lhasa.interfaces.IInterpreterCallback;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class OfflineTranslator extends Translator {

    private static volatile OfflineTranslator mInstance = null;

    private ExecutorService mService = null;
    private OfflineDictManager mManager = null;

    private OfflineTranslator() {
        mService = Executors.newFixedThreadPool(1);
        mManager = OfflineDictManager.getInstance();
    }

    public OfflineTranslator getInstance() {
        if (mInstance == null) {
            synchronized (OfflineTranslator.class) {
                mInstance = new OfflineTranslator();
            }
        }

        return mInstance;
    }

    @Override
    public String requestTranslateLocked(final int direction, final String input) {
        OfflineDictWord candidate = mManager.queryDict(input);
        return candidate == null ? "" : candidate.getTranslation();
    }

    @Override
    public void requestTranslateAsync(final int handler, final int direction, final String input
            , final IInterpreterCallback callback) {
        super.requestTranslateAsync(handler, direction, input, callback);

        if (callback == null) {
            return;
        }

        mService.submit(new Runnable() {
            @Override
            public void run() {
                String result = requestTranslateLocked(direction, input);
                int[] languages = getLanguagesByDirection(direction);
                callback.onTranslateDone(handler, result, languages[0], languages[1], input);
            }
        });
    }
}
